﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace checked_and_unchecked
{
    class Program
    {
        static void Main(string[] args)
        {
            //int aSmall = 50;
            //int bSmall = aSmall + 100;
            //int d = aSmall + bSmall;
            //Console.WriteLine("a = " + aSmall + " " + "b = " + bSmall + " " + "d = " + d);
            //// переполнения не происходит и все согласно арифметике
            //int a = int.MaxValue;
            //int b = a + 100;
            //int c = a + b;
            //Console.WriteLine("a = " + a + " " + "b = " + b + " " + "c = " + c);
            //по умолчанию установлен unchecked и получено переполнение и вместо 
            //ожидаемого без учета переполнения значения для с =  2 * 2,147,483,647 + 100
            //получим с = 98
            // использование блока  checked{ .....   } проверит переполнение
            //checked
            //{
            //    int aCh = int.MaxValue;
            //    int bCh = aCh + 100;
            //    int e = aCh + bCh;
            //    Console.WriteLine(("a = " + aCh + " " + "b = " + bCh + " " + "e = " + e));
            //}
            // использование выражения checked
            //int aCh = int.MaxValue;
            //int bCh = checked(aCh + 100);
            //int e = (aCh + bCh);
            //Console.WriteLine(("a = " + aCh + " " + "b = " + bCh + " " + "e = " + e));
            //для байт
            ///*un*/checked
            //{
            //    byte myB = 245;
            //    byte myC = 14;
            //    byte a = (byte)(myB + myC);
            //    Console.WriteLine(a);
            //} 
            // чтобы выполнить операцию только с константами при переполнении используем
            //unchecked потому что по умолчанию с константами применяется checked

            unchecked
            {
                int a = int.MaxValue * int.MaxValue;
                int b = a + int.MaxValue;
                Console.WriteLine(b);
            }       
            
           
            

            Console.ReadLine();

        }
    }
}
